package code.class4;

import java.util.Arrays;

/**
 * https://leetcode.cn/problems/longest-substring-without-repeating-characters/
 * 无重复字符的最长子串
 */
public class Code02_LongestSubstringWithoutRepeatingCharacters {
    public static void main(String[] args) {
        String str = "abcdaef";
        int i = longestSubstringWithoutRepeatingCharacters(str);
        System.out.println(i);
    }

    public static int longestSubstringWithoutRepeatingCharacters(String str) {
        char[] chars = str.toCharArray();
        int[] last = new int[256];
        Arrays.fill(last, -1);
        int ans = 0, l = 0, r = 0;
        for (; r < str.length(); r++) {
            // 确保滑动窗口的左边界 l 不会停留在重复字符的位置
            // 这行代码的意思是 如果 l 小于 last[chars[r]] + 1，就更新 l 为 last[chars[r]] + 1，确保左边界移动到重复字符之后

            // [左边界] 和 [符号上次出现位置+1] 比较谁大
            l = Math.max(l, last[chars[r]] + 1);
            // 计算最大位置
            ans = Math.max(ans, r - l + 1);
            // 记录字符所在位置
            last[chars[r]] = r;
        }
        return ans;
    }
}
